home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / t3_1 / encorsrc.lha / encore_sources / scheme / runtime.t < prev    next >
Text File  |  1988-05-02  |  12KB  |  481 lines

  1. (herald runtime (env tsys))
  2.  
  3. ;;; Copyright (c) 1985, 1988 Yale University
  4. ;;;     Authors: N Adams, R Kelsey, D Kranz, J Philbin, K Pitman, J Rees.
  5. ;;; This material was developed by the T Project at the Yale University Computer
  6. ;;; Science Department.  Permission to copy this software, to redistribute it,
  7. ;;; and to use it for any purpose is granted, subject to the following restric-
  8. ;;; tions and understandings.
  9. ;;; 1. Any copy made of this software must include this copyright notice in full.
  10. ;;; 2. Users of this software agree to make their best efforts (a) to return
  11. ;;;    to the T Project at Yale any improvements or extensions that they make,
  12. ;;;    so that these may be included in future releases; and (b) to inform
  13. ;;;    the T Project of noteworthy uses of this software.
  14. ;;; 3. All materials developed as a consequence of the use of this software
  15. ;;;    shall duly acknowledge such use, in accordance with the usual standards
  16. ;;;    of acknowledging credit in academic research.
  17. ;;; 4. Yale has made no warranty or representation that the operation of
  18. ;;;    this software will be error-free, and Yale is under no obligation to
  19. ;;;    provide any services, by way of maintenance, update, or otherwise.
  20. ;;; 5. In conjunction with products arising from the use of this material,
  21. ;;;    there shall be no use of the name of the Yale University nor of any
  22. ;;;    adaptation thereof in any advertising, promotional, or sales literature
  23. ;;;    without prior written consent from Yale in each case.
  24. ;;;
  25.  
  26. ;;; Modified by Ashwin Ram, July 1985
  27.  
  28. ;;; Compilation support environment for Scheme picks up integrable
  29. ;;; procedure definitions made in this file.
  30.  
  31. (define-constant (string-set! string n char)
  32.    (set (string-elt string n) char))
  33.  
  34. (define-constant (set-car! x y)
  35.    (set (car x) y))
  36.  
  37. (define-constant (set-cdr! x y)
  38.    (set (cdr x) y))
  39.  
  40. ;;; Define Scheme's READ in terms of T's, etc.
  41.  
  42. (define-local-syntax (define-scheme pat . body)
  43.    (let ((foo (lambda (name val)
  44.                  `(*define scheme-env ',name ,val))))
  45.       (cond ((atom? pat)
  46.              (foo pat (car body)))
  47.             (else
  48.              (foo (car pat)
  49.                   `(named-lambda ,(car pat) ,(cdr pat) . ,body))))))
  50.  
  51. (define-scheme (head stream) (car stream))
  52. (define-scheme (tail stream) (force (cdr stream)))
  53. (define-scheme (empty-stream? stream) (null? stream))
  54.  
  55. (define-scheme user-initial-environment scheme-env)
  56.  
  57. (define-scheme (error . items)
  58.    (apply error
  59.           (apply string-append
  60.                  "~a"
  61.                  (map (always "~%~10t~s") (cdr items)))
  62.           items))
  63.  
  64. (define-scheme (explode atom)
  65.    (map! (lambda (char) (string->symbol (char->string char)))
  66.          (string->list (symbol->string (enforce symbol? atom)))))
  67.  
  68. (define-scheme (implode list)
  69.    (string->symbol (list->string (map (compose char symbol->string) list))))
  70.  
  71. (define-local-syntax (optional r specs . body)
  72.    (cond ((null? specs) `(block ,@body))
  73.          (else
  74.           (let ((spec (car specs))
  75.                 (specs (cdr specs))
  76.                 (var (generate-symbol 'rest)))
  77.              `(let* ((,var ,r)
  78.                      (,(car spec)
  79.                       (cond ((null? ,var) ,(or (cadr spec) 'nil))
  80.                             (else (car ,var)))))
  81.                  (optional (cdr ,var) ,specs ,@body))))))
  82.  
  83. (define-scheme (read . r)
  84.    (optional r ((port (standard-input)))
  85.       (read port)))
  86.  
  87. (define-scheme (read-char . r)                       ;; for RRRS
  88.    (optional r ((port (standard-input)))
  89.       (read-char port)))
  90.  
  91. (define-scheme (char-ready? . r)                       ;; for RRRS
  92.    (optional r ((port (standard-input)))
  93.       (char-ready? port)))
  94.  
  95. (define-scheme (newline . r)
  96.    (optional r ((port (standard-output)))
  97.       (newline port)
  98.       t))
  99.  
  100. (define-scheme (write-char c . r)                    ;; for RRRS
  101.    (optional r ((port (standard-output)))
  102.       (write-char port c)
  103.       t))
  104.  
  105. (define-scheme (princ thing . r)
  106.    (optional r ((port (standard-output)))
  107.       (display thing port)
  108.       t))
  109.  
  110. (*define scheme-env 'display (*value scheme-env 'princ))
  111.  
  112. (define-scheme (prin1 thing . r)
  113.    (optional r ((port (standard-output)))
  114.       (print thing port)
  115.       t))
  116.  
  117. (*define scheme-env 'write   (*value scheme-env 'prin1))
  118.  
  119. (define-scheme (print thing . r)
  120.    (optional r ((port (standard-output)))
  121.       (format port "~&~S~&" thing)                   ;; Sort of.
  122.       t))
  123.  
  124. (define-scheme (call-with-input-file spec proc)
  125.    (with-open-ports ((port (open spec '(in))))
  126.       (proc port)))
  127.  
  128. (define-scheme (call-with-output-file spec proc)
  129.    (with-open-ports ((port (open spec '(out))))
  130.       (proc port)))
  131.  
  132. (define-scheme (memv x l)
  133.    (mem equiv? x l))
  134.  
  135. (define-scheme (assv x l)
  136.    (ass equiv? x l))
  137.  
  138. (define-scheme (member x l)
  139.    (mem alikev? x l))
  140.  
  141. (define-scheme (assoc x l)
  142.    (ass alikev? x l))
  143.  
  144. (define-scheme random
  145.   (let ((r (make-random 7)))
  146.     (named-lambda random (n)
  147.       (mod (r) n))))
  148.  
  149. (define-scheme (char-numeric? ch)
  150.   (digit? ch 10))
  151.  
  152. (define-scheme (string-ci=? string1 string2)
  153.   (string-equal? (string-upcase string1) (string-upcase string2)))
  154.  
  155.  
  156. (define-scheme (substring string start end)
  157.   (substring string start (fx+ (fx- end start) 1)))
  158.  
  159. (define-scheme (number->string n f)
  160.   (ignore f)
  161.   (format nil "~s" n))
  162.  
  163. (define-scheme (string->number s)
  164.   (read (string->input-port s)))
  165.  
  166. (define pi 3.141592653589793)
  167. (define pi/2 1.5707963267948966)
  168.  
  169. ;; Different args from T's ATAN.
  170. (define-scheme (atan y . x-option)
  171.   (let ((y (->float y)))
  172.     (if (null? x-option)
  173.     (atan y)
  174.     (let ((x (->float (car x-option))))
  175.       (if (and (fl= x 0.0) (fl= y 0.0))
  176.           (error "arctangent of (0,0)")
  177.           (cond ((fl= y 0.0)
  178.              (if (fl< x 0.0) pi 0.0))
  179.             ((fl= x 0.0)
  180.              (if (fl< y 0.0) (fl- 0.0 pi/2) pi/2))
  181.             ((fl< x 0.0)
  182.              (let ((theta (atan (fl/ y x))))
  183.                (if (fl< y 0.0) (fl- theta pi) (fl+ theta pi))))
  184.             (else (atan (fl/ y x)))))))))
  185.  
  186.  
  187.  
  188. (define-scheme (vector . l)
  189.    (list->vector l))
  190.  
  191. (define-scheme (open-input-file filename)
  192.    (open filename 'in))
  193.  
  194. (define-scheme (open-output-file filename)
  195.    (open filename 'out))
  196.  
  197. (define-scheme (t-top)
  198.    (t-top))
  199.  
  200.  
  201. ;; Need -- ceiling floor round runtime
  202.  
  203. (define scheme-from-t
  204.       '(t
  205.         nil
  206.         else
  207.  
  208.         string-set!
  209.     set-car!
  210.     set-cdr!  ; what a hack
  211. ;; Primitive procedures (see index to A&S)
  212.  
  213.         procedure?            
  214.         boolean?          
  215.         apply
  216.         atom?
  217.         car cdr caar cadr cdar cddr
  218.         caaar caadr cadar caddr cdaar cdadr cddar cdddr
  219.         caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr
  220.         cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr
  221.         cons
  222.         eq?
  223.         eval
  224.         list
  225.         max min
  226.         not                        ;; cheat
  227.         null?
  228.         number?
  229.         symbol?
  230.         remainder
  231.     quotient
  232.         + - * /
  233.         = < >
  234.         1+ -1+
  235.    %%add
  236.    %%subtract
  237.    %%multiply
  238.    %%remainder
  239.    %%less?
  240.    %%equal?
  241.  
  242. ;; These things aren't called "primitive," but are used in the
  243. ;; book or problem sets
  244.  
  245.         force
  246.         abs gcd sqrt
  247.         sin cos exp expt
  248.         <= >=
  249. ;;      get put
  250.         assq
  251.         memq
  252.         length
  253.    fx+
  254.    fx-
  255.    fx-and
  256.    fx-ior
  257.    fx-xor
  258.    fx-not
  259.    fx-abs
  260.    fx-negate
  261.    fx-odd?  
  262.    fx-even? 
  263.    fx-bit?  
  264.    fx-ashl  
  265.    fx-ashr  
  266.    fx-ash   
  267.    fx-length
  268.    fx-expt  
  269.    fx-zero? 
  270.    fx*
  271.    fx/ 
  272.    fx=
  273.    fx<
  274.    fx>
  275.    fxn=
  276.    fx>=
  277.    fx<=
  278.    fx-rem
  279.    fl+
  280.    fl-
  281.    fl*
  282.    fl/ 
  283.    fl=
  284.    fl<
  285.    fl>
  286.    fln=
  287.    fl>=
  288.    fl<=
  289.  
  290.         append
  291.         reverse  
  292.         append!  ; needed by expand quasiquote
  293. ;;      reverse!  - ???
  294.         char?
  295.         string->symbol
  296.         symbol->string
  297.         pair?
  298.         integer?
  299.         real?
  300.         rational?
  301.         zero?
  302.         positive?
  303.         negative?
  304.         odd?
  305.         even?
  306.         log
  307.         tan
  308.         asin
  309.         acos
  310. ;;      atan                         ;; Different from T's ATAN.
  311.         char-upcase
  312.         char-downcase
  313.         string?
  314.         string-length
  315.         string-append
  316.         string->list
  317.         list->string
  318.         vector?
  319.         make-vector
  320.         vector-length
  321.         vector->list
  322.         list->vector
  323.         map
  324.         call-with-current-continuation
  325.         input-port?
  326.         output-port?
  327.  
  328. ;; MacScheme has this, so what the heck.
  329.  
  330.         peek-char
  331.  
  332. ;; Macro auxiliaries
  333.  
  334.         unbound-label                ;; labels
  335.         cons*                        ;; backquote
  336.         or-aux                       ;; or
  337.         no-more-cond-clauses         ;; cond (?)
  338.         display-traced-objects       ;; trace
  339.         set-traced                   ;; trace
  340.         set-untraced                 ;; untrace
  341.         untrace-traced-objects       ;; untrace
  342.         undefined-value              ;; (?)
  343.         make-delay                   ;; delay
  344.         repl-env                     ;; pp
  345.         *pp                          ;; pp
  346.         *pp-symbol                   ;; pp
  347.         disclose                     ;; pp
  348.         *object                      ;; object (for PP hack)
  349. ;        extend-pointer-elt           ;; object (for PP hack)
  350.         unquote
  351.         unquote-splicing
  352.  
  353.     *define-syntax
  354.     make-macro-descriptor
  355.     setter
  356.     make-locale
  357.     
  358. ;; Other useful stuff for CS221, non-standard but what the heck...
  359.  
  360. ;;      concatenate-symbol           ;; Make them use (string->symbol (string-append (symbol->symbol ...))) instead?
  361. ;;      log
  362.  
  363. ;; Debugging musts, etc.
  364.  
  365.         compile-file
  366.     compile
  367.         load
  368.         exit
  369.         backtrace
  370.         where-defined
  371.         crawl
  372.         debug                        ;; necessary
  373.         repl-results                 ;; for ##
  374.         ret
  375.     eof
  376.       transcript-on
  377.       transcript-off
  378.       *value
  379.       t-implementation-env           ;; for time macro
  380.       gc
  381.  
  382.        ))
  383.  
  384. (walk (lambda (sym)
  385.          (*define scheme-env sym (*value scheme-internal-env sym)))
  386.       scheme-from-t)
  387.  
  388. (define scheme-aliased-from-t
  389.       '((mapcar map)
  390.         (mapc walk)
  391. ;        (and *and)
  392. ;        (or *or)
  393.         (vector-ref vref)
  394.         (vector-set! vset)
  395.         (vector-fill! vector-fill)
  396.  
  397. ;; A&S
  398.  
  399.         (make-new-symbol generate-symbol)
  400.         (generate-uninterned-symbol generate-symbol)   ;; Good enough
  401.  
  402. ;; RRRS
  403.  
  404.         (complex? number?)      ;; ??
  405.         (exact? false)          ;; ??
  406.         (inexact? true)         ;; ??
  407.         (=? =)
  408.         (<? <)
  409.         (>? >)
  410.         (<=? <=)
  411.         (>=? >=)
  412.         (modulo mod)            ;; Close enough
  413.         (eqv? equiv?)           ;; Sort of
  414.         (equal? alikev?)
  415.         (list-ref nth)
  416.         (list-tail nthcdr)
  417.         (last-pair lastcdr)
  418.         (char=? char=)
  419.         (char<? char<)
  420.         (char>? char>)
  421.         (char<=? char<=)
  422.         (char>=? char>=)
  423.         (char-ci=? char=ic)
  424.         (char-ci<? char<ic)
  425.         (char-ci>? char>ic)
  426.         (char-ci<=? char<=ic)
  427.         (char-ci>=? char>=ic)
  428.         (char-alphabetic? alphabetic?)
  429.         (char-whitespace? whitespace?)
  430.         (char-upper-case? uppercase?)
  431.         (char-lower-case? lowercase?)
  432.         (char->integer char->ascii)
  433.         (integer->char ascii->char)
  434.         (string-null? string-empty?)
  435.         (string=? string-equal?)
  436.         (string-ref string-elt)
  437.         (string-fill! string-fill)
  438.         (string-copy copy-string)
  439.         (for-each walk)
  440.         (eof-object? eof?)
  441.         (current-input-port  standard-input)
  442.         (current-output-port standard-output)
  443.         (t-standard-env standard-env)
  444.         (environment-bind! *lset)
  445.     (environment-ref *value)
  446.     (environment-set! *set-value)
  447.  
  448.        ))
  449.  
  450. (walk (lambda (foo)
  451.          (*define scheme-env (car foo) (*value scheme-internal-env (cadr foo))))
  452.       scheme-aliased-from-t)
  453.  
  454. (define-scheme (close-input-port port)
  455.   (close port)
  456.   t)
  457.  
  458. (define-scheme (close-output-port port)
  459.   (close port)
  460.   t)
  461.  
  462. (define-scheme (substring-fill! string start end ch)
  463.   (let ((string (enforce string? string))
  464.         (ch (enforce char? ch)))
  465.     (let ((size (string-length string)))
  466.       (cond ((or (fx< end start)
  467.          (fx< start 0)
  468.          (fx>= end size))
  469.          (error "Bad index in ~S"
  470.             `(SUBSTRING-FILL! ,start ,end ,ch)))
  471.         (else
  472.          (do ((i start (fx+ i 1)))
  473.          ((fx> i end) string)
  474.            (set (nthchar string i) ch)))))))
  475.  
  476.  
  477. (define t-reset (*value t-implementation-env 't-reset))
  478.  
  479. ;;****************************************************************************
  480. 'SCHEME_RUNTIME
  481.